package pe.reproduccion;

import pe.algenetico.MiRandom;
import pe.cromosoma.Cromosoma;

public class Ciclos extends Cruce{

	public Cromosoma[] cruce(Cromosoma padre1, Cromosoma padre2, MiRandom ran, int param){
		int l = padre1.getLong_cromo();
		
		int[] hijo1 = new int[l];
		int[] hijo2 = new int[l];
		
		for(int i= 0; i < l; i++){
			hijo1[i] = -1;
			hijo2[i] = -1;
		}
		
		
		
		boolean finCiclo = false;
		
		int ind = 0;
		int principioCiclo1 = padre1.getIndices()[0];
		int principioCiclo2 = padre1.getIndices()[0];
		
		//HIJO1
		while(!finCiclo){
			hijo1[ind] = padre1.getIndices()[ind];
			int aux = padre2.getIndices()[ind];
			
			if (aux == principioCiclo1) finCiclo = true;
			else{
				boolean encontrado = false;
				ind= 0;
				//buscamos la poscicion de ese valor en el padre1
				while(!encontrado){
					if(padre1.getIndices()[ind] == aux) encontrado = true;
					else ind++;
				}	
			}
		}
		
		finCiclo = false;
		//HIJO2
		while(!finCiclo){
			hijo2[ind] = padre2.getIndices()[ind];
			int aux = padre1.getIndices()[ind];
			
			if (aux == principioCiclo2) finCiclo = true;
			else{
				boolean encontrado = false;
				ind= 0;
				//buscamos la poscicion de ese valor en el padre1
				while(!encontrado){
					if(padre2.getIndices()[ind] == aux) encontrado = true;
					else ind++;
				}	
			}
		}
		
		
		//rellenamos las que falten del hijo1 con el padre2
		for(int i= 0; i < l; i++){
			if (hijo1[i] == -1) hijo1[i] = padre2.getIndices()[i];
			if (hijo2[i] == -1) hijo2[i] = padre1.getIndices()[i];
		}
		
		
		padre1.setIndices(hijo1);
		padre2.setIndices(hijo2);
		
		padre1.setAptitud(padre1.evalua());
		padre2.setAptitud(padre2.evalua());
		
		Cromosoma[] resultado = new Cromosoma[2];
		resultado[0]=padre1;
		resultado[1]=padre2;
		
		return resultado;
	}
}
